"""
@Author  : 康帅
@Time    : 2021/5/28 15:04
@Function: 匿名函数lambda,在合适的地方使用比def更简洁
"""


# def函数与lambda函数对比
def func(x, y, z):
    return x + y + z


print(func(1, 2, 3))

# 使用匿名函数
f = lambda x, y, z: x + y + z
print(f(1, 2, 3))
print('======================')


def f1(x):
    return x ** 2


def f2(x):
    return x ** 3


def f3(x):
    return x ** 4


L = [f1, f2, f3]
for f in L:
    print(f(2))

print(L[0](3))
print("===========================")

# 使用匿名函数
L = [lambda x: x ** 2,
     lambda x: x ** 3,
     lambda x: x ** 4]
for f in L:
    print(f(2))

print(L[0](3))
print("===========================")

# map函数将被传入的函数作用到一个可迭代对象的每一个元素上，并且返回包含了所有这些函数调用结果的一个列表
counters = [1, 2, 3, 4]


def inc(x):
    return x + 10


# map函数等同于for，但是运行速度会比for更快
data = list(map(inc, counters))
print(data)

data = [inc(x) for x in counters]
print(data)

# 使用到匿名函数
data = list(map((lambda x: x + 3), counters))
print(data)

# filter选择可迭代对象中的元素
data = list(range(-5, 5))
print(data)

data = list(filter((lambda x: x > 0), range(-5, 5)))
print(data)

# reduce合并可迭代对象中的元素
from functools import reduce

data = reduce((lambda x, y: x + y), [1, 2, 3, 4])
print(data)
data = reduce((lambda x, y: x * y), [1, 2, 3, 4])
print(data)

# 列表推导 vs map
# 常规
res = []
for x in 'spam':
    res.append(ord(x))
print(res)

# 列表推导
res = [ord(x) for x in 'spam']
print(res)

# map
res = list(map(ord, 'spam'))
print(res)


def list_sort():
    """
    列表排序
    :return:
    """
    a = [(1, 2), (4, 1), (9, 10), (13, -3)]
    a.sort(key=lambda x: x[1])
    print(a)


def list_sort_parallel():
    """
    列表并行排序
    :return:
    """
    list1 = [2, 3, 1]
    list2 = [6, 5, 7]
    data = zip(list1, list2)
    data = sorted(data)
    list1, list2 = map(lambda t: list(t), zip(*data))
    print(list1, list2)


if __name__ == '__main__':
    list_sort()
    list_sort_parallel()
